22
תגובות

סריקת קבצי ZIP לפני העלתם ?

פתח Ben ,
אני רוצה לאפשר לעלות קבצי ZIP בלבד לאתר.
אני מחפש דרך שבה אוכל לסרוק (מנגנון חיצוני \ שלי - חיצוני עדיף) את מה שמכווץ בקובץ ZIP, במידה ואין שם משהו מזיק אז הקובץ עולה, אחרת לא.
בעיקרון, מה שאמור להיות בקובץ זיפ זה קבצי PDF או WORD או תמונה.

האם מישהו יכול להמליץ לי על דרך טובה ובטוחה שבה אוכל לסרוק את הקבצים ולוודא שאין בהם משהו מזיק ? שהמשתמש שיוריד אותם בעתיד יוכל להוריד בבטחה ?

אני רוצה לעשות את זה מכיוון שזה יחסוך אישור ידני. כרגע, כל מה שעולה עובר אישור שלי. אני בודק אם הכל בסדר ורק אז מאשר את הפוסט.. הבדיקה היא רק בקובץ שהוא באמת מכיל את מה שהוא אמור להכיל.

22 תשובות

avatar ענה Splash ב 04 לאוגוסט 2015 #

כדי לבצע סריקה אמיתית אתה צריך לבצע אותה מול אנטי וירוס איכותי שיוודא שאותו קובץ וורד,pdf או תמונה לא מכילים בתוכם וירוסים.
במידה ומטרת הסריקה היא רק לוודא שהוא מכיל סיומת של אותם קבצים אתה מוזמן לקרוא בתיעוד של php איך לעבוד מול קבצי zip - http://php.net/manual/en/book.zip.php

avatar ענה Ben ב 04 לאוגוסט 2015 #

אני צריך מול אנטי וירוס

avatar ענה Splash ב 04 לאוגוסט 2015 #

לא יצא לי להתעסק עם סריקות קבצים לצורך כזה אז אני לא כל כך יכול לעזור לך,אבל ברפרוף זריז באינטרנט נמצא - Virus total
אתה תצטרך לקרוא את התנאי שימוש [לא ניתן להשתמש לצורך מסחרי] וגם את ההגבלות [4 בקשות לדקה עם אפשרות להרחבה] וכמובן לבנות לבד את כל ההתקשרות מול ה api.
במידה ואתה צריך לשימוש מסחרי אני מאמין שיש חברות שידעו לספק גם את זה אבל זה גם יעלה לך לא מעט.

avatar ענה Ben ב 04 לאוגוסט 2015 #

הבנתי, תודה!

avatar ענה intval ב 04 לאוגוסט 2015 #

אתה מוזמן לבחור לעצמך אנטיוירוס, למשל kaspersky,
וכל אנטיוירוס מאפשר הפעלה דרך שורת הפקודה.
כל מה שישאר לך הוא להפעיל את הפקודה המתאימה באמצעות פקודות כמו shell_exec ולוודא שהפלט שהאנטיוירוס החזיר לא כולל מילים כמו
virus
dangerous
omg, wtf
וכו'

avatar ענה Ben ב 04 לאוגוסט 2015 #

לא הבנתי איך להשתמש במה שאמרת אלכס.
לפי מה שאני מבין האנטי וירוס צריך להיות מותקן על המחשב של הלקוח וזה לא יעיל לי.
אני צריך משהו פשוט, בעת ההעלאה, אם יש משהו נגוע, כלום לא עולה. אחרת אני מעלה. לכן הבדיקה תצטרך להיות בעת העלאה על ידי סורק כלשהו באינטרנט שיש לן API.
וירוס טוטל נראה לי הכי טוב.. יש לך הצעה נוספת ?

avatar ענה Splash ב 05 לאוגוסט 2015 #

אלכס התכוון שתתקין את האנטי וירוס אצלך בשרת ובעזרת השורת פקודה להפעיל אותו ולקבל את הפלט שלו ולפי זה לדעת אם מדובר בוירוס או לא.
לא הצעתי לך את העניין מאחר ורשמת שאתה מעדיף שירות חיצוני,במידה ואתה מעוניין שהאנטי וירוס יהיה אצלך בשרת אתה יכול ללכת על ClamAV שלא מעט אתרי העלאות משתמשים.היתרון הוא כמובן זה שהוא קוד פתוח ככה שאתה יכול לשחק איתו איך שאתה רוצה.


אגב גם במידה ואתה משתמש בשירות חיצוני אתה בכל מקרה אתה צריך להעלות את הקובץ לשרת שלך קודם אחרת כל הפעולה של העלאה תקח המון זמן והמשתמשים פשוט לא יעשו את זה.

avatar ענה Ben ב 05 לאוגוסט 2015 #

הבנתי.
חשבתי גם על הדבר הבא:

המשתמשים מעלים את הקובץ רגיל לתיקיה X, כל 4 דקות אני סורק בעזרת VIRUSTOTAL את 4 הקבצים הראשונים שהועלו, שולח מייל עם תשובה (הועלה סופית או לא) למשתמש שהעלה את זה ומצרף קישור לפוסט במייל.

אם אני כן מיישם את זה, איך אני יכול לבצע פעולה כל 4 דקות ?
אז חשבתי ישר על CRON (?) שיגש לקובץ מסויים שמשם יריץ את הכל כל 4 דקות.

אבל אם הקובץ נמצא ב public_html/x/y/z/abc.php והמשתמש נכנס לקובץ הזה (ההפניה מתקבלת על ידי גולש ולא על ידי CRON) אז זה גם יבדוק...
ואם המשתמש ירענן את העמוד 1000 פעם זה יבדוק 1000 פעם... יש דרך למנוע את זה?

avatar ענה Splash ב 05 לאוגוסט 2015 #

נתחיל מזה שאתה לא נותן גישה ישירה לקבצים אלה "מסתיר" את הכתובת האמיתית ואת ההורדה מבצע באמצעות php/nginx/apache/whatever.
אחרי שסגרנו את הפינה הזאת,המסד שלך אמור להיראות ככה - מיקום,שם קובץ,אושר\לא אושר .
ברגע שקובץ סיים להעלות אתה מכניס אותו למסד עם 0 ב"אושר\לא אושר".
--------------------------------------------------------------------------------------------------------------------------------------------------
עכשיו אתה מריץ קרון כל פרק זמן מסויים ששולף X קבצים אחרונים שעדיין לא אושרו ושולח אותם לאנטי וירוס,במידה והקובץ נמצא תקין - תעדכן במסד ל"אושר".

אם מישהו מנסה להוריד קובץ שעדיין לא נבדק מול אנטי וירוס אתה יכול לעשות שזה יציג להם את הקובץ עם הערה שהקובץ עדיין לא נסרק או פשוט להציג שגיאה שהקובץ ממתין לאישור.

avatar ענה Ben ב 05 לאוגוסט 2015 #

תודה הבנתי הכל חוץ מהפינה.. לא הבנתי מה זה אומר.


נתחיל מזה שאתה לא נותן גישה ישירה לקבצים אלה "מסתיר" את הכתובת האמיתית ואת ההורדה מבצע באמצעות php/nginx/apache/whatever

avatar ענה Splash ב 05 לאוגוסט 2015 #

תחת איזה פלטפורמה בנויה המערכת? ומה הגודל המקסימאלי שאפשר לעלות לשרת ?

avatar ענה Ben ב 05 לאוגוסט 2015 #

אני בונה את המערכת בעזרת CODEIGNITER לגבי הגודל המקסימאלי לא בדקתי. איך אני בודק?

avatar ענה Splash ב 05 לאוגוסט 2015 #

אם לא הגדרת גודל מקסימאלי זה כבר בעיה אני מציע לך לחפש קצת מידע באינטרנט על התחום אחרת האתר שלך יפול מהר מאוד.

בכל מקרה ב php יש שתי הגדרות שקשורות לזה [ולא כדאי ששם תתבצע הבדיקה אלה בקוד עצמו] -
upload_max_filesize - הגודל המקסימאלי שאפשר להעלות.
post_max_size = 40M - גודל המידע שניתן לשלוח בבקשות post - חייב להיות שווה או גדול מ upload_max_filesize אחרת תקבל שגיאה שהגודל של ה post גדול מידי.

לגבי ההסתרה של הכתובת - https://ellislab.com/codeigniter/user-guide/helpers/download_helper.html
אתה אמור לקבל ב get את ה id של הקובץ -> לטעון את המיקום של במסד ולהדפיס אותו למשתמש כמו בדוגמא.

avatar ענה Ben ב 05 לאוגוסט 2015 #

אני מאוחסן בחברה, מן הסתם שהחברה הגדירה גודל מקסימאלי בשרת שלה. האם יש דרך שאני יכול לראות את זה או שרק לברר דרך החברה ?

לגבי ההורדה והכתובת,
במסד יש לי איידי וכתובת הורדה, אני מקבל את האיידי דרך GET , פונה למסד, שולף את הכתובת הורדה באותה שורה ומוריד.
האם אין דרך שהמשתמש יוכל לגלות איכשהו את הכתובת הורדה ?
הכתובת הורדה תיהיה משהו כזה (?):
http://www.site.com/uploaded/abc.zip
אני מניח שאת כל הקבצים שמועלים אני יעלה לכאן (?):
public_html/uploaded
צריך להיות לתיקיה הרשאות מסויימות ?

avatar ענה Splash ב 06 לאוגוסט 2015 #

קודם כל אם אתה מאוחסן על אחסון משותף רוב הסיכויים שהתנאי שימוש שלך אוסרים על סוג כזה של שירות משום שהוא מנצל המון משאבים.
בכל מקרה כמו שכתבתי זה שיש הגבלה באמצעות php זה נחמד אבל ממש לא ככה עושים את זה בדיוק כמו שאתה לא רוצה שאם עמוד לא נמצא יהיה כתוב פשוט 404 אלה עמוד עם קצת יותר משמעות שישאיר את המשתמש באתר. זה לא מקצועי,זה מכוער וחלק מהמשתמשים כנראה גם לא יבינו מה השגיאה.
כדי לדעת מה ההגבלה דרך המנוע - phpinfo

לגבי החלק של ההורדה,מן הסתם אתה צריך למנוע גישה ישירה לתיקיה.

avatar ענה Ben ב 06 לאוגוסט 2015 #

אבל על מנת לעלות קובץ לתיקיה מסויימת אני חייב לתת לה גישה 777
http://www.codeigniter.com/user_guide/libraries/file_uploading.html#the-upload-directory

avatar ענה Splash ב 06 לאוגוסט 2015 #

אין קשר בין מה שאני רשמתי למה שאתה רשמת,אתה מדבר על הרשאות כתיבה של השרת ואני מדבר על כניסה חיצונית,מן הסתם גם הקוד שקורא את הקובץ יצטרך גישה אליו אחרת איך הוא יכול לשלוח את המידע שלו ?
http://stackoverflow.com/questions/19118482/deny-access-to-one-specific-folder-in-htaccess

avatar ענה Ben ב 11 לאוגוסט 2015 #

הבנתי הכל ויישמתי הכל ואני מאוד מאוד מודה לך על העזרה והסבלנות.
יש לי שאלה אחרונה שאשמח אם תענה לי עליה. יכול להיות שענית כבר אבל אשמח לחידוד.

בנוגע ל CRON.
דרך הפאנל DA שלי אני מבצע קרון ומנווט אותו public_html/cron.php
יש לקובץ הזה הרשאות רגילות כשהוא מקבל כאשר אני פותח קובץ חדש (הרשאות קובץ 644).
עכשיו הקרון עובד הכל טוב ויפה, אם אני בתור משתמש, גולש פשוט, נכנס ל site.com/cron.php , הקוד מתחיל לרוץ ומתחילות בדיקות.
כדי למנוע את זה, הכנסתי את הקובץ cron.php לתיקיה X שבה יש גם קובץ HTACCESS עם השורה Deny from all. עכשיו הכניסה ל site.com/x/cron.php נמנעת.
השאלה היא האם גם הפניה של הקרון עצמו לקובץ נמנעת ? או שהקרון שהגדרתי דרך ה DA שלי יוכל להריץ את הקובץ שנמצא בתיקיית X ? (בהנחה שהחלפתי את הניווט שהיה כתוב בDA לניווט העדכני עם תיקיית X).

ככה עושים את זה ? יש דרך אחרת למנוע מהמשתמש גישה לקבצים שאמורים להיות אך ורק לפעולות קרון?

avatar ענה Ben ב 12 לאוגוסט 2015 #

:-)

avatar ענה Splash ב 13 לאוגוסט 2015 #

זה תלוי איך אתה קורא לקובץ,אם אתה מבצע את זה דרך הטרמינל ולא דרך wget אז הקרון צריך לפעול כמו שצריך משום שהקובץ htaccess בכלל לא נקרא מתי שאתה ניגש ישירות ל php דרך ה cli.

בכל מקרה לא עושים את זה ככה - אין שום סיבה שקבצים יהיו תחת public_html ,תשים אותם בתיקיה אחת למעלה וככה תבטיח שלא יהיה ניתן להיכנס אליהם דרך הדפדפן.
בנוסף אפשר לבדוק דרך ()php_sapi_name באיזה סביבה php רץ או לבדוק האם קיים REMOTE_ADDR

avatar ענה Ben ב 13 לאוגוסט 2015 #

במקרה זה אני עובד עם CODEIGNITER.
ראיתי מדריכים באינטרנט ולפיהם יש לי קונטרולר אחד בשם CRON עם פונקציה INDEX בפונקציה עצמה יש את התנאי הבא:

if(is_cli()){
      // cron bla bla
    } else show_404();

.
אז זה בסדר אני מניח.
-------------------------
באתרים שלא רצים עם פריימוורק מסויים פשוט לפתוח תיקיה cron מעל public_html ושם יהיו הקבצים ?

avatar ענה Splash ב 13 לאוגוסט 2015 #

אין שום קשר בין אם אתה משתמש בפריימוורק ובין אם לא את הפונקציה is_cli כתבו ב php ככה שגם אתה יכול לכתוב אותה לבד.
בדיקה בתיעוד תביא לך -

This function checks both if the PHP_SAPI value is ‘cli’ or if the STDIN constant is defined.

כלומר הם בודקים אם קיים הקבוע STDIN וגם אם הערך בקבוע PHP_SAPI הוא cli [אגב PHP_SAPI = ()php_sapi_name] והבדיקה הזאת לא תעבוד אם אתה מריץ את php ולא את php-cli

בכל מקרה שום חלק מהקוד שלך לא אמור להיות ב public_html למעט ה index.php והוא יטען את כל הקבצי php מתיקייה שאינה נגישה לדפדפן - אתה מוזמן לראות איך הפריימוורק של laravel עובד על מנת לראות איך עושים את זה נכון.